package controladores;

import excepciones.PuntajeMenorACeroException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import juego.CiudadDeJuego;
import juego.Juego;
import juego.Jugador;
import persistores.persistoresDeCiudad.CiudadPersistor;
import vehiculos.Auto;
import vehiculos.CuatroPorCuatro;
import vehiculos.Estado;
import vehiculos.Moto;
import vehiculos.Vehiculo;
import vistas.InterfazCreacionPartida;
import vistas.InterfazJuegoPrincipal;
import vistas.VentanaJuegoPrincipal;

public class ControladorCreacionPartida extends Controlador implements ActionListener {
    private InterfazCreacionPartida vista;
    private Juego modelo;
    
    public ControladorCreacionPartida (InterfazCreacionPartida vista, Juego modelo) {
        this.vista = vista;
        this.modelo = modelo;
        vista.setSaludo(modelo.getJugador().getNickname());
    }
    
    @Override
    public void actionPerformed (ActionEvent evento) {
        if (evento.getActionCommand().equals("Volver")) {
            vista.cerrar();
        }
        else if (evento.getActionCommand().equals("Jugar")) {
            int nivel = vista.getNivel();
            String tipoDeVehiculo = vista.getVehiculo();
            if (nivel == 0 | tipoDeVehiculo.equals("ERROR")) vista.mostrarMensajeDeError();
            else {
                Vehiculo vehiculo = crearVehiculo(tipoDeVehiculo);
                CiudadDeJuego ciudad = crearCiudadDeJuego(nivel);
                inicializarJugador(nivel, vehiculo, ciudad);
                InterfazJuegoPrincipal vistaJuego = new VentanaJuegoPrincipal();
                ControladorJuegoPrincipal controlador = new ControladorJuegoPrincipal (vistaJuego, this.modelo);
                vistaJuego.setControlador(controlador);
                vistaJuego.arrancar();
                vista.cerrar();
            }
        }
    }
    
    private Vehiculo crearVehiculo (String tipoDeVehiculo) {
        Estado tipo = null;
        if (tipoDeVehiculo.equals("Moto")) tipo = Moto.getInstancia();
        else if (tipoDeVehiculo.equals("Cuatro Por Cuatro")) tipo = CuatroPorCuatro.getInstancia();
        else if (tipoDeVehiculo.equals("Auto")) tipo = Auto.getInstancia();
        Vehiculo vehiculo = new Vehiculo();
        vehiculo.setTipoDeVehiculo(tipo);
        return vehiculo;
    }
    
    private CiudadDeJuego crearCiudadDeJuego (int nivel) {
        CiudadDeJuego ciudad = null;
        
        CiudadPersistor persistor = new CiudadPersistor();
        switch(nivel) {
        case 1: 
            ciudad = persistor.deserializar(".\\CiudadNivelFacil");  
            break;
        case 2: 
            ciudad = persistor.deserializar(".\\CiudadNivelModerado");
            break;
        case 3: 
            ciudad = persistor.deserializar(".\\CiudadNivelDificil");
            break;
        }
        
       if (ciudad != null) {
           ciudad.seleccionarPuntoDePartida();
           ciudad.seleccionarPuntoDeLlegada();
       }
        
       return ciudad;
    }
    
    private void inicializarJugador (int nivel, Vehiculo vehiculo, CiudadDeJuego ciudad) {
        Jugador jugador = this.modelo.getJugador();
        jugador.setNivel(nivel);
        // La cantidad de movimientos maximos es igual a nivel * 10
        jugador.setCantidadDeMovimientosMaximos(nivel*10);
        jugador.setVehiculo(vehiculo);
        try {
            jugador.actualizarPuntaje();
        } catch (PuntajeMenorACeroException exception) {
            // Esto no deberia ocurrir nunca, pues todavia no se han hecho movimientos
            System.exit(1);
        }
        jugador.setCiudadDeJuego(ciudad);
        vehiculo.setEsquinaActual(ciudad.getPuntoDePartida());        
    }

}
